/**
 * 给定数组A，每次选择一个数值，将设该数值最靠右的位置为p，
 * 则可以删除[p...]
 * 问最少几次把原数组删光。
 * 
 * 首先贪心，每次必然选择所有颜色合法位置最靠左的删。
 * 然后考虑怎么找。
 * 令map[i]保存i颜色的位置，按顺序。
 * 
 * 每一次：
 *    找所有map[i].back()的最小值即可
 *    这就是当前要删除的位置, 记作p
 *    再把所有map[i]中大于等于p的数删除，即可
 * 
 * O(N)，因为删除最多只能执行N次   
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vvi = vector<vi>;

int N;
vi A;
map<int, vi> Map;
map<int, int> Last;

int proc(){
    Map.clear();
	for(int i=1;i<=N;++i) Map[A[i]].emplace_back(i);

	if(Map.size() == 1) return N;
    
    int sz = Map.size();
    int ans = 0;
	// int last = N + 1;
    while(1){
		int last = N + 1;
		for(const auto & p : Map){
			last = min(last, p.second.back());
		}

		ans += 1;
		for(auto it=Map.begin(),et=Map.end();it!=et;){
			while(not it->second.empty() and it->second.back() >= last){
				it->second.pop_back();
			}
			if(it->second.empty()){
				it = Map.erase(it);
			}else{
				++it;
			}
		}

		if(Map.empty()) break;
	}


	return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N ;
		A.assign(N + 1, {});
		for(int i=1;i<=N;++i){
			cin >> A[i];
		}
		cout << proc() << "\n";
    }
    return 0;
}